www.gusucode.com > VC 纯代码实现LED数字时钟程序源码 > VC 纯代码实现LED数字时钟程序源码/code/DigitalClock.cpp

    
/********************************************************************************

  File:    DigitalClock.h"
  Author:  Mt.Hu (hmt-abc@163.com)
  Date:    2008/4/28

  Note:    Please include the comment if you use the file in your project

********************************************************************************/

// DigitalClock.cpp : implementation file
//

#include "stdafx.h"
#include "DigitalClock.h"


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CDigitalClock

CDigitalClock::CDigitalClock()
{	
	m_crBk = ::GetSysColor(COLOR_BTNFACE);
	m_crText = ::GetSysColor(COLOR_BTNTEXT);
	m_nAlign = 1;
	m_nWidth = 0;	
	m_nHour = 0;
	m_nMinute = 0;
	m_nSecond = 0;
	m_nSpace = 5;
	m_nXmargin = 10;
	m_nYmargin = 4;	
}

CDigitalClock::~CDigitalClock()
{
}


BEGIN_MESSAGE_MAP(CDigitalClock, CStatic)
	//{{AFX_MSG_MAP(CDigitalClock)
	ON_WM_PAINT()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDigitalClock message handlers


void CDigitalClock::DrawSection1(int nLeft)
{
	if (m_memDC.m_hDC!=NULL)
	{
		CPoint point[4];
		point[0].x=nLeft+(int)(0.1*m_nWidth);
		point[0].y=m_nYmargin;

		point[1].x=nLeft+(int)(0.9*m_nWidth);
		point[1].y=m_nYmargin;

		point[2].x=nLeft+(int)(0.7*m_nWidth);
		point[2].y=(int)(0.2*m_nWidth)+m_nYmargin;

		point[3].x=nLeft+(int)(0.3*m_nWidth);
		point[3].y=(int)(0.2*m_nWidth)+m_nYmargin;

		CBrush br(m_crText);
		CRgn rgn;
		rgn.CreatePolygonRgn(point,4,ALTERNATE);
		m_memDC.FillRgn(&rgn,&br);

		br.DeleteObject();
		rgn.DeleteObject();
		
		m_memDC.MoveTo(point[0]);
		m_memDC.LineTo(point[1]);
		
		m_memDC.MoveTo(point[1]);
		m_memDC.LineTo(point[2]);
		
		m_memDC.MoveTo(point[2]);
		m_memDC.LineTo(point[3]);
		
		m_memDC.MoveTo(point[3]);
		m_memDC.LineTo(point[0]);			
	}	
}

void CDigitalClock::DrawSection2(int nLeft)
{
	if (m_memDC.m_hDC!=NULL)
	{
		CPoint point[5];
		point[0].x=nLeft+m_nWidth;
		point[0].y=(int)(0.1*m_nWidth)+m_nYmargin;

		point[1].x=nLeft+m_nWidth;
		point[1].y=(int)(0.8*m_nWidth)+m_nYmargin;

		point[2].x=nLeft+(int)(0.9*m_nWidth);
		point[2].y=(int)(0.9*m_nWidth)+m_nYmargin;

		point[3].x=nLeft+(int)(0.8*m_nWidth);
		point[3].y=(int)(0.8*m_nWidth)+m_nYmargin;

		point[4].x=nLeft+(int)(0.8*m_nWidth);
		point[4].y=(int)(0.3*m_nWidth)+m_nYmargin;

		CBrush br(m_crText);
		CRgn rgn;
		rgn.CreatePolygonRgn(point,5,ALTERNATE);
		m_memDC.FillRgn(&rgn,&br);

		br.DeleteObject();
		rgn.DeleteObject();

		m_memDC.MoveTo(point[0]);
		m_memDC.LineTo(point[1]);
		
		m_memDC.MoveTo(point[1]);
		m_memDC.LineTo(point[2]);
		
		m_memDC.MoveTo(point[2]);
		m_memDC.LineTo(point[3]);
		
		m_memDC.MoveTo(point[3]);
		m_memDC.LineTo(point[4]);
		
		m_memDC.MoveTo(point[4]);
		m_memDC.LineTo(point[0]);
	}

	
}

void CDigitalClock::DrawSection3(int nLeft)
{
	if (m_memDC.m_hDC!=NULL)
	{
		CPoint point[5];
		point[0].x=nLeft+m_nWidth;
		point[0].y=(int)(1.1*m_nWidth)+m_nYmargin;

		point[1].x=nLeft+m_nWidth;
		point[1].y=(int)(1.8*m_nWidth)+m_nYmargin;

		point[2].x=nLeft+(int)(0.8*m_nWidth);
		point[2].y=(int)(1.6*m_nWidth)+m_nYmargin;

		point[3].x=nLeft+(int)(0.8*m_nWidth);
		point[3].y=(int)(1.1*m_nWidth)+m_nYmargin;

		point[4].x=nLeft+(int)(0.9*m_nWidth);
		point[4].y=m_nWidth+m_nYmargin;

		CBrush br(m_crText);
		CRgn rgn;
		rgn.CreatePolygonRgn(point,5,ALTERNATE);
		m_memDC.FillRgn(&rgn,&br);

		br.DeleteObject();
		rgn.DeleteObject();

		m_memDC.MoveTo(point[0]);
		m_memDC.LineTo(point[1]);
		
		m_memDC.MoveTo(point[1]);
		m_memDC.LineTo(point[2]);
		
		m_memDC.MoveTo(point[2]);
		m_memDC.LineTo(point[3]);
		
		m_memDC.MoveTo(point[3]);
		m_memDC.LineTo(point[4]);
		
		m_memDC.MoveTo(point[4]);
		m_memDC.LineTo(point[0]);
	}
		
}

void CDigitalClock::DrawSection4(int nLeft)
{	
	if (m_memDC.m_hDC!=NULL)
	{
		CPoint point[4];
		point[0].x=nLeft+(int)(0.1*m_nWidth);
		point[0].y=(int)(1.9*m_nWidth)+m_nYmargin;

		point[1].x=nLeft+(int)(0.9*m_nWidth);
		point[1].y=(int)(1.9*m_nWidth)+m_nYmargin;

		point[2].x=nLeft+(int)(0.7*m_nWidth);
		point[2].y=(int)(1.7*m_nWidth)+m_nYmargin;

		point[3].x=nLeft+(int)(0.3*m_nWidth);
		point[3].y=(int)(1.7*m_nWidth)+m_nYmargin;		

		CBrush br(m_crText);
		CRgn rgn;
		rgn.CreatePolygonRgn(point,4,ALTERNATE);
		m_memDC.FillRgn(&rgn,&br);

		br.DeleteObject();
		rgn.DeleteObject();

		m_memDC.MoveTo(point[0]);
		m_memDC.LineTo(point[1]);
		
		m_memDC.MoveTo(point[1]);
		m_memDC.LineTo(point[2]);
		
		m_memDC.MoveTo(point[2]);
		m_memDC.LineTo(point[3]);
		
		m_memDC.MoveTo(point[3]);
		m_memDC.LineTo(point[0]);		
	
	}

}

void CDigitalClock::DrawSection5(int nLeft)
{
	if (m_memDC.m_hDC!=NULL)
	{
		CPoint point[5];
		point[0].x=nLeft;
		point[0].y=(int)(1.1*m_nWidth)+m_nYmargin;

		point[1].x=nLeft;
		point[1].y=(int)(1.8*m_nWidth)+m_nYmargin;

		point[2].x=nLeft+(int)(0.2*m_nWidth);
		point[2].y=(int)(1.6*m_nWidth)+m_nYmargin;

		point[3].x=nLeft+(int)(0.2*m_nWidth);
		point[3].y=(int)(1.1*m_nWidth)+m_nYmargin;

		point[4].x=nLeft+(int)(0.1*m_nWidth);
		point[4].y=m_nWidth+m_nYmargin;

		CBrush br(m_crText);
		CRgn rgn;
		rgn.CreatePolygonRgn(point,5,ALTERNATE);
		m_memDC.FillRgn(&rgn,&br);

		br.DeleteObject();
		rgn.DeleteObject();

		m_memDC.MoveTo(point[0]);
		m_memDC.LineTo(point[1]);
		
		m_memDC.MoveTo(point[1]);
		m_memDC.LineTo(point[2]);
		
		m_memDC.MoveTo(point[2]);
		m_memDC.LineTo(point[3]);
		
		m_memDC.MoveTo(point[3]);
		m_memDC.LineTo(point[4]);
		
		m_memDC.MoveTo(point[4]);
		m_memDC.LineTo(point[0]);
	}


}

void CDigitalClock::DrawSection6(int nLeft)
{
	if (m_memDC.m_hDC!=NULL)
	{
		CPoint point[5];
		point[0].x=nLeft;
		point[0].y=(int)(0.1*m_nWidth)+m_nYmargin;

		point[1].x=nLeft;
		point[1].y=(int)(0.8*m_nWidth)+m_nYmargin;

		point[2].x=nLeft+(int)(0.1*m_nWidth);
		point[2].y=(int)(0.9*m_nWidth)+m_nYmargin;

		point[3].x=nLeft+(int)(0.2*m_nWidth);
		point[3].y=(int)(0.8*m_nWidth)+m_nYmargin;

		point[4].x=nLeft+(int)(0.2*m_nWidth);
		point[4].y=(int)(0.3*m_nWidth)+m_nYmargin;

		CBrush br(m_crText);
		CRgn rgn;
		rgn.CreatePolygonRgn(point,5,ALTERNATE);
		m_memDC.FillRgn(&rgn,&br);

		br.DeleteObject();
		rgn.DeleteObject();

		m_memDC.MoveTo(point[0]);
		m_memDC.LineTo(point[1]);
		
		m_memDC.MoveTo(point[1]);
		m_memDC.LineTo(point[2]);
		
		m_memDC.MoveTo(point[2]);
		m_memDC.LineTo(point[3]);
		
		m_memDC.MoveTo(point[3]);
		m_memDC.LineTo(point[4]);
		
		m_memDC.MoveTo(point[4]);
		m_memDC.LineTo(point[0]);
	}

}

void CDigitalClock::DrawSection7(int nLeft)
{
	if (m_memDC.m_hDC!=NULL)
	{
		CPoint point[6];
		point[0].x=nLeft+(int)(0.3*m_nWidth);
		point[0].y=(int)(0.9*m_nWidth)+m_nYmargin;

		point[1].x=nLeft+(int)(0.7*m_nWidth);
		point[1].y=(int)(0.9*m_nWidth)+m_nYmargin;

		point[2].x=nLeft+(int)(0.8*m_nWidth);
		point[2].y=m_nWidth+m_nYmargin;

		point[3].x=nLeft+(int)(0.7*m_nWidth);
		point[3].y=(int)(1.1*m_nWidth)+m_nYmargin;

		point[4].x=nLeft+(int)(0.3*m_nWidth);
		point[4].y=(int)(1.1*m_nWidth)+m_nYmargin;

		point[5].x=nLeft+(int)(0.2*m_nWidth);
		point[5].y=m_nWidth+m_nYmargin;

		CBrush br(m_crText);
		CRgn rgn;
		rgn.CreatePolygonRgn(point,6,ALTERNATE);
		m_memDC.FillRgn(&rgn,&br);

		br.DeleteObject();
		rgn.DeleteObject();

		m_memDC.MoveTo(point[0]);
		m_memDC.LineTo(point[1]);
		
		m_memDC.MoveTo(point[1]);
		m_memDC.LineTo(point[2]);
		
		m_memDC.MoveTo(point[2]);
		m_memDC.LineTo(point[3]);
		
		m_memDC.MoveTo(point[3]);
		m_memDC.LineTo(point[4]);
		
		m_memDC.MoveTo(point[4]);
		m_memDC.LineTo(point[5]);
		
		m_memDC.MoveTo(point[5]);
		m_memDC.LineTo(point[0]);
	}

}

void CDigitalClock::Draw2Dot(int nLeft)
{
	if (m_memDC.m_hDC!=NULL)
	{
		CBrush br(m_crText);				

		CRect rect;
		rect.SetRect(nLeft+(int)(0.3*m_nWidth),(int)(0.4*m_nWidth)+m_nYmargin,
			nLeft+(int)(0.6*m_nWidth),(int)(0.7*m_nWidth)+m_nYmargin);
		m_memDC.Ellipse(rect);
		CRgn rgn1;
		rgn1.CreateEllipticRgn(rect.left,rect.top,rect.right,rect.bottom);
		m_memDC.FillRgn(&rgn1,&br);

		rect.OffsetRect(0,(int)(0.8*m_nWidth)+m_nYmargin);
		m_memDC.Ellipse(rect);
		CRgn rgn2;
		rgn2.CreateEllipticRgn(rect.left,rect.top,rect.right,rect.bottom);
		m_memDC.FillRgn(&rgn2,&br);

		br.DeleteObject();
		rgn1.DeleteObject();
		rgn2.DeleteObject();
	}
}

void CDigitalClock::SetBkColor(COLORREF crBk)
{
	m_crBk = crBk;	

	DrawTimer();
}

void CDigitalClock::SetTextColor(COLORREF crText)
{
	m_crText = crText;
	
	DrawTimer();
}

void CDigitalClock::SetAlign(int nAlign)
{
	m_nAlign = nAlign;
	
	DrawTimer();
}

COLORREF CDigitalClock::GetBkColor()
{
	return m_crBk;
}

COLORREF CDigitalClock::GetTextColor()
{
	return m_crText;
}

int CDigitalClock::GetAlign()
{
	return m_nAlign;
}

void CDigitalClock::SetClock(int nHour, int nMinute, int nSecond)
{
	m_nHour = nHour;
	m_nMinute = nMinute;
	m_nSecond = nSecond;

	DrawTimer();	
}

void CDigitalClock::DrawHour()
{
	int nLeft=m_nXmargin;
	if (m_nHour<10)
	{
		DrawSingleNumber(0,nLeft);
		nLeft+=m_nWidth+m_nSpace;
		DrawSingleNumber(m_nHour,nLeft);
	}
	else
	{
		TCHAR *c=new TCHAR[10];
		_itoa(m_nHour,c,10);
		int num1=c[0]-48;
		int num2=c[1]-48;
		DrawSingleNumber(num1,nLeft);
		nLeft+=m_nWidth+m_nSpace;
		DrawSingleNumber(num2,nLeft);
	}
	nLeft+=m_nWidth;
	Draw2Dot(nLeft);	
}

void CDigitalClock::DrawMinute()
{
	int nLeft=m_nXmargin+3*m_nWidth+m_nSpace;
	if (m_nMinute<10)
	{
		DrawSingleNumber(0,nLeft);
		nLeft+=m_nWidth+m_nSpace;
		DrawSingleNumber(m_nMinute,nLeft);
	}
	else
	{
		TCHAR c[10]={0};		
		_itoa(m_nMinute,c,10);		
		int num1=c[0]-48;
		int num2=c[1]-48;
		DrawSingleNumber(num1,nLeft);
		nLeft+=m_nWidth+m_nSpace;
		DrawSingleNumber(num2,nLeft);		
	}
}

void CDigitalClock::DrawSecond()
{
	int nLeft=m_nXmargin+6*m_nWidth+2*m_nSpace;
	if (m_nSecond<10)
	{
		DrawSingleNumber(0,nLeft);
		nLeft+=(int)(1.4*m_nWidth);
		DrawSingleNumber(m_nSecond,nLeft);
	}
	else
	{
		TCHAR *c=new TCHAR[10];
		_itoa(m_nSecond,c,10);
		int num1=c[0]-48;
		int num2=c[1]-48;
		DrawSingleNumber(num1,nLeft);
		nLeft+=m_nWidth+m_nSpace;
		DrawSingleNumber(num2,nLeft);	
	}
}

void CDigitalClock::DrawTimer()
{	
	if (m_memDC.m_hDC!=NULL)
	{	
		
		GetClientRect(&m_rect);		
		
		m_nWidth = (int)(m_rect.Height()-2*m_nYmargin)/2;
		if (0 == m_nAlign)
		{			
			m_nXmargin = m_nYmargin;
		}
		else if (2 == m_nAlign)
		{			
			m_nXmargin = m_rect.Width()-8*m_nWidth-3*m_nSpace-m_nYmargin;
		}
		else
		{
			m_nXmargin = (int)(m_rect.Width()-8*m_nWidth-3*m_nSpace)/2;
		}
		

		m_memDC.FillSolidRect(m_rect,m_crBk);

		CPen pen(PS_SOLID,1,m_crText);
		CPen* pOldPen=m_memDC.SelectObject(&pen);

		DrawHour();
		DrawMinute();
		DrawSecond();

		Invalidate();
		
		m_memDC.SelectObject(pOldPen);
		pen.DeleteObject();
	}
}

void CDigitalClock::DrawSingleNumber(int nNum,int nLeft)
{
	switch (nNum)
	{
	case 0:
		DrawSection1(nLeft);
		DrawSection2(nLeft);
		DrawSection3(nLeft);
		DrawSection4(nLeft);
		DrawSection5(nLeft);
		DrawSection6(nLeft);
		break;
	case 1:		
		DrawSection2(nLeft);
		DrawSection3(nLeft);		
		break;
	case 2:
		DrawSection1(nLeft);
		DrawSection2(nLeft);
		DrawSection4(nLeft);
		DrawSection5(nLeft);
		DrawSection7(nLeft);
		break;
	case 3:
		DrawSection1(nLeft);
		DrawSection2(nLeft);
		DrawSection3(nLeft);
		DrawSection4(nLeft);		
		DrawSection7(nLeft);
		break;
	case 4:		
		DrawSection2(nLeft);
		DrawSection3(nLeft);		
		DrawSection6(nLeft);
		DrawSection7(nLeft);
		break;
	case 5:
		DrawSection1(nLeft);
		DrawSection3(nLeft);
		DrawSection4(nLeft);
		DrawSection6(nLeft);
		DrawSection7(nLeft);
		break;
	case 6:
		DrawSection1(nLeft);
		DrawSection3(nLeft);
		DrawSection4(nLeft);
		DrawSection5(nLeft);
		DrawSection6(nLeft);
		DrawSection7(nLeft);
		break;
	case 7:
		DrawSection1(nLeft);
		DrawSection2(nLeft);
		DrawSection3(nLeft);		
		break;
	case 8:
		DrawSection1(nLeft);
		DrawSection2(nLeft);
		DrawSection3(nLeft);
		DrawSection4(nLeft);
		DrawSection5(nLeft);
		DrawSection6(nLeft);
		DrawSection7(nLeft);
		break;
	case 9:
		DrawSection1(nLeft);
		DrawSection3(nLeft);
		DrawSection4(nLeft);
		DrawSection2(nLeft);
		DrawSection6(nLeft);
		DrawSection7(nLeft);
		break;
	default:
		;
	}

}

void CDigitalClock::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	
	GetClientRect(&m_rect);		
	
	if (m_memDC.m_hDC==NULL)
	{
		m_nYmargin = (int)(0.1*m_rect.Height());
		CBitmap bmp;
		CBitmap* pOldBmp;

		m_memDC.CreateCompatibleDC(&dc);
		bmp.CreateCompatibleBitmap(&dc,m_rect.Width(),m_rect.Height());
		pOldBmp=m_memDC.SelectObject(&bmp);		
	}	
			
	dc.BitBlt(0,0,m_rect.Width(),m_rect.Height(),&m_memDC,0,0,SRCCOPY);	
	
}

void CDigitalClock::SetSpace(int nSpace)
{
	m_nSpace = nSpace;

	DrawTimer();
}

int CDigitalClock::GetSpace()
{
	return m_nSpace;
}